package leetcode;

/**
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 *
 * 示例 1:
 *
 * 输入: 123
 * 输出: 321
 *  示例 2:
 *
 * 输入: -123
 * 输出: -321
 * 示例 3:
 *
 * 输入: 120
 * 输出: 21
 * 注意:
 *
 * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−231,  231 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。
 *
 * @author: cuihao
 * @create: 2020-05-12 02:55
 **/
public class Reverse1 {
    public static void main(String[] args) {
        solution1(1534236469);
    }

    // 解法1 使用字符串翻转
    // 但是数字太大无法转化
    public static int solution0(int x) {
        if (x == 0) {
            return 0;
        }
        boolean fu = false;
        if (x < 0) {
            x = 0 - x;
            fu = true;
        }

        String num = String.valueOf(x);

        // StringBuffer的reverse
        StringBuffer stringBuffer = new StringBuffer(num);
        String r = stringBuffer.reverse().toString();

        Integer a = Integer.valueOf(r); // 这里如果数字太大无法转换
        if (fu) {
            a = 0 - a;
        }
        System.out.println(a);
        return a;
    }

    // 解法2 使用数字
    public static int solution1(int x) {
        if (x == 0) {
            return 0;
        }
        boolean fu = false;
        if (x < 0) {
            x = 0 - x;
            fu = true;
        }
        int res = 0;
        while (x != 0) {
            // 123 -> 3
            int last = x % 10;

            res = res * 10 + last;
            if (res % 10 != last) {
                return 0;
            }
            // 核心在这 百位 -> 千位
            x = x / 10;
        }
        if (fu) {
            res = 0 - res;
        }
        System.out.println(res);
        return res;
    }

}
